package com.zywhn.meta.node.entity;

import java.io.Serializable;
import java.util.Date;

import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;

import com.zywhn.meta.node.constant.ClazzConstants;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import lombok.Data;

/**
 * 智能节点实体类
 * 
 * @author Atlas Lee
 * @version 1.0
 * @date 2024-12-1
 * @copyright Atlas Lee<4859345@qq.com>. All rights reserved.
*/
@Data
@Entity
@Table(name = "zywhn_node")
class Node implements Serializable {

    private static final long serialVersionUID = ClazzConstants.ZYWHN_NODE;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    /**
     * 节点hash
     * 32字节的全局唯一哈希标识
     */
    @Column(name = "zywhn_hash")
    private String hash;

    /**
     * 节点实体类型。在ClazzConstants中定义
     * 每个智能节点的子类都需要在ClazzConstants中定义唯一的clazz值
     */
    @Column(name = "zywhn_clazz")
    private Long clazz = ClazzConstants.ZYWHN_NODE;

    /**
     * 节点数据隔离标识
     * 比如基于租户管理的系统，可以用租户的Id作为isolation值，实现租户级别的数据隔离
     */
    @Column(name = "zywhn_isolation")
    private Long isolation;

    /**
     * 节点编码
     * 基于isolation和clazz生成的唯一编码
     */
    @Column(name = "zywhn_code")
    private String code;

    /**
     * 父节点Id
     */
    @Column(name = "zywhn_parent")
    private Long parentId;

    /**
     * 默认类型Id
     * 智能节点支持多个类型，与类型是多对多的关联。但只有一个默认类型
     */
    @Column(name = "zywhn_default_type")
    private Long defaultTypeId;

    /**
     * 引用Id
     * 智能节点支持值引用。如果智能节点的某个属性值为空，且存在引用对象，可以通过引用对象获取值
     */
    @Column(name = "zywhn_reference")
    private Long referenceId;

    /**
     * 节点名称
     * 支持全文检索（默认中文）
     */
    @Column(name = "zywhn_name")
    private String name;

    /**
     * 节点数值
     */
    @Column(name = "zywhn_value")
    private Long value;

    /**
     * 节点内容
     * 支持全文检索（默认中文）
     */
    @Column(name = "zywhn_content")
    private String content;

    /**
     * 节点二进制标志位
     * 最多支持63个二进制标志
     */
    @Column(name = "zywhn_flags")
    private Long flags;

    /**
     * 节点扩展字段
     * 支持JSON格式
     * 字段标题在ExtensionTitle中定义
     */
    @Column(name = "zywhn_extension")
    private String extension;

    /**
     * 节点智能合约
     * 支持Groovy语法
     */
    @Column(name = "zywhn_contract")
    private String contract;

    /**
     * 节点通用状态
     * 0-未开始；1-正常进行；2-异常；3-正常结束；4-异常结束；5-关闭
     */
    @Column(name = "zywhn_state")
    private Integer state;

    /**
     * 节点创建时间
     */
    @CreatedDate
    @Column(name = "zywhn_create_time")
    private Date createTime;

    /**
     * 节点创建者
     */
    @CreatedBy
    @Column(name = "zywhn_creator")
    private Long creatorId;

    /**
     * 节点更新时间
     */
    @LastModifiedDate
    @Column(name = "zywhn_update_time")
    private Date updateTime;

    /**
     * 节点更新者
     */
    @LastModifiedBy
    @Column(name = "zywhn_updater")
    private Long updaterId;

    /**
     * 节点版本
     * 同时作为乐观锁
     */
    @Version
    @Column(name = "zywhn_version")
    private Integer version;

    /**
     * 节点是否被禁用
     * False-正常；True-禁用
     */
    @Column(name = "zywhn_is_banned")
    private Boolean isBanned;

    /**
     * 节点是否被删除
     * False-正常；True-删除
     */
    @Column(name = "zywhn_is_deleted")
    private Boolean isDeleted;
}
